package cn.iocoder.yudao.module.hs.service.material;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.hs.controller.admin.bigscreen.vo.WarehouseMaterialCount;
import cn.iocoder.yudao.module.hs.controller.admin.material.vo.MaterialModeRespVO;
import cn.iocoder.yudao.module.hs.controller.admin.material.vo.MaterialPageReqVO;
import cn.iocoder.yudao.module.hs.controller.admin.material.vo.MaterialSaveReqVO;
import cn.iocoder.yudao.module.hs.dal.dataobject.material.MaterialDO;

import javax.validation.Valid;
import java.util.List;
import java.util.Set;

/**
 * 物料信息 Service 接口
 *
 * @author 航盛
 */
public interface MaterialService {

    /**
     * 创建物料信息
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createMaterial(@Valid MaterialSaveReqVO createReqVO);

    /**
     * 批量创建物料信息
     *
     * @param materialList 创建信息
     * @return 编号
     */
    void createMaterials(@Valid List<MaterialSaveReqVO> materialList);

    /**
     * 更新物料信息
     *
     * @param updateReqVO 更新信息
     */
    void updateMaterial(@Valid MaterialSaveReqVO updateReqVO);

    /**
     * 删除物料信息
     *
     * @param id 编号
     */
    void deleteMaterial(Long id);

    /**
     * 获得物料信息
     *
     * @param id 编号
     * @return 物料信息
     */
    MaterialDO getMaterial(Long id);

    /**
     * 获得物料信息分页
     *
     * @param pageReqVO 分页查询
     * @return 物料信息分页
     */
    PageResult<MaterialDO> getMaterialPage(MaterialPageReqVO pageReqVO);

    /**
     * 获得物料机型分页
     *
     * @param pageReqVO 分页查询
     * @return 物料信息分页
     */
    PageResult<MaterialModeRespVO> getMaterialModePage(MaterialPageReqVO pageReqVO);

    /**
     * 根据托盘编码更新对应的物料信息
     *
     * @param trayCode 托盘编码
     */
    void updateMaterialEntryByTrayCode(String trayCode, Long warehouseId, Long deptId, String warehouseType);

    /**
     * 物料更换托盘
     *
     * @param materialDOList
     * @param trayCode
     */
    void updateMaterialTray(List<MaterialDO> materialDOList, String trayCode);

    /**
     * 物料更换托盘
     *
     * @param materialDOList
     * @param trayCode
     */
    void updateMaterialTray(List<MaterialDO> materialDOList, String trayCode, String boxCode);

    /**
     * 根据物料代码获得物料信息
     *
     * @param modeCode 物料代码
     * @return 物料信息
     */
    List<MaterialDO> getMaterials(Long warehouseId, String modeCode);

    /**
     * 根据物料代码获得物料信息
     *
     * @param modeCode 物料代码
     * @return 物料信息
     */
    List<MaterialDO> getMaterialsByModeCode(Long warehouseId, String modeCode);

    /**
     * 获得物料信息
     *
     * @param materialCode 物料编号
     * @return 物料信息
     */
    MaterialDO getMaterial(String materialCode);

    /**
     * 根据托盘编号获得物料信息
     *
     * @param trayCode 托盘编号
     * @return 物料信息
     */
    List<MaterialDO> getMaterialListByTrayCode(String trayCode);

    /**
     * 根据托盘编号获得物料信息
     *
     * @param boxCode 物料箱号
     * @return 物料信息
     */
    List<MaterialDO> getMaterialListByBoxCode(String boxCode);

    /**
     * 根据物料箱编号获得物料信息
     *
     * @param boxCodeList 物料箱编号
     * @return 物料信息
     */
    List<MaterialDO> getMaterialListByBoxCode(List<String> boxCodeList);

    /**
     * 根据物料编号获得物料信息
     *
     * @param codeList 物料编号
     * @return 物料信息
     */
    List<MaterialDO> getMaterialListByCode(List<String> codeList);

    /**
     * 根据物料编码更新托盘编码
     *
     * @param trayCode 托盘编码
     * @param code     物料编码
     */
    void updateTrayCodeByCode(String trayCode, String code);

    /**
     * 根据物料编码更新物料箱编码
     *
     * @param trayCode  托盘编码
     * @param boxCode 物料箱编码
     * @param code     物料编码
     */
    void updateTrayCodeBoxCodeByCode(String trayCode, String boxCode, String code);

    /**
     * 根据物料编码更新托盘编码为空
     *
     * @param code 物料编码
     */
    void updateNullTrayCodeByCode(String code);

    /**
     * 根据物料编码更新托盘编码为空
     *
     * @param code 物料编码
     */
    void updateNullBoxCodeByCode(String code);

    /**
     * 更新物料质检结果
     *
     * @param trayCode
     * @param qcResult
     * @param materialCode
     */
    void updateMaterialQcResult(String trayCode, String boxCode, String qcResult, String materialCode);

    /**
     * 三方仓更新物料信息，已出库
     *
     * @param materialCodes
     * @return
     */
    void updateMaterialOut(Set<String> materialCodes, Long toWarehouseDeptId);

    /**
     * 三方仓更新物料信息，退回
     *
     * @param materialCodes
     * @return
     */
    void updateMaterialRollback(Set<String> materialCodes, Long warehouseId);

    /**
     * 查询当日所有在库的物料数量
     * @return
     */
    List<WarehouseMaterialCount> getWarehouseMaterialCountList();

    /**
     *
     * @return
     */
    Integer getProductWarehouseCount();
}
